公式注入(Formula Injection)攻击
早在 2013 年、2014 年就相继有人提出 Cell Injection、CSV Injection,诱导受害者打开带有恶意公式的 Excel 文件,在打开文件后执行 Excel 公式。凡是带这种公式计算功能的表格处理软件或多或少都会受影响,如 WPS、LibreOffice 等等。
现在越来越多的云端产品都提供了数据导出为 CSV、xlsx 文件格式,如果能控制它们的数据源,并且未做内容验证,就可以触发公式注入,最近我在一些内部平台中就相继发现不少这类问题。
作为一个简单的测试,test.csv 文件内容如下:
1,"=SUM(1,2)"
其中第二列为计算公式,用 Excel、WPS或者 LibreOffice 打开后,都可以看到 B1 的数据为计算结果 3。
除了“=”开头会当作公式执行,“@”、“-”、“+”开头的都可以,不过在测试中发现 WPS 不会执行“@”开头的。
现在把 test.csv 改为:
1,"=HYPERLINK(""http://www.shellcodes.org"",""blog"")"
注:上方出现两个连续的双引号是为了转义,Excel 解析时会将两个双引号转义为单个双引号。
用 Excel 打开后,第二列呈现的是“blog”超链接,单击后即可通过浏览器打开。
再进一步,改为:
1,=cmd|' /C notepad.exe'!A0
用 Excel 打开后,会出现确认安全提示,只要点了确认就可以打开记事本。
不过,执行外部命令需要用到 Excel 的 DDE(Dynamic Data Exchange,动态数据交换),在新版本的 Excel 中(我的为 Excel 2016)需要修改设置才能复现:
文件 > 选项 > 信任中心 > 信任中心设置 > 外部内容 在“动态数据交换的安全设置”中勾选“启用动态数据交换服务器查找”和“启用动态数据交换服务器启动”。
虽然微软默认关闭了 DDE 让执行外部命令有一些难度,但并不表示这个漏洞就无用武之地,毕竟公式是可以改变数据最终呈现的,比如上文提到的 HYPERLINK 能用来钓鱼、泄露信息,或者涉及金额计算的地方用来修改金额等。
这类漏洞通常出现在涉及导出数据的地方,比如导出日志、统计信息、配置信息等等位置。
1. 漏洞防范
- 根据业务场景来严格限制输入格式,比如填 URI 的地方判断 URI 格式是否正确;
- 生成表格文件时,凡是公式字符开头(=、+、-、@)数据,可以添加单引号在首部来阻止被解析。
2. 参考资料
- 《This Is How Cops Trick Dark-Web Criminals Into Unmasking Themselves》,这篇文章讲述了 FBI 利用这种技巧来跟踪罪犯。